//package com.dks.filter;
//
//
//import java.io.IOException;
//
//import javax.servlet.Filter;
//import javax.servlet.FilterChain;
//import javax.servlet.FilterConfig;
//import javax.servlet.ServletException;
//import javax.servlet.ServletRequest;
//import javax.servlet.ServletResponse;
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//
//import com.dks.util.Commond;
//
//import io.jsonwebtoken.Jwts;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.stereotype.Component;
//
//
///**
// * token验证拦截
// *
// * @author Ah Nan
// * @time 2017-08-01
// */
//@Component
//public class AuthFilter implements Filter {
//
//    private static Logger logger = LoggerFactory.getLogger(AuthFilter.class);
//
//    @Autowired
//    private AppConfigProperties appConfigProperties;
//
//    @Autowired
//    private RedisTemplate redisTemplate;
//
//    @Override
//    public void destroy() {
//
//    }
//
//    @Override
//    public void doFilter(ServletRequest request, ServletResponse response,
//                         FilterChain chain) throws IOException, ServletException {
//
//        HttpServletRequest req = (HttpServletRequest) request;
//        HttpServletResponse rep = (HttpServletResponse) response;
//        String uri = req.getRequestURI();
//        //如果在接口白名单中，放行
//        if (appConfigProperties.getWhiteApiList().contains(uri)) {
//            //请求路由
//            chain.doFilter(request, response);
//            return;
//        }
//
//        //设置允许跨域的配置
//        // 这里填写你允许进行跨域的主机ip（正式上线时可以动态配置具体允许的域名和IP）
//        rep.setHeader("Access-Control-Allow-Origin", "*");
//        // 允许的访问方法
//        rep.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE, PATCH");
//        // Access-Control-Max-Age 用于 CORS 相关配置的缓存
//        rep.setHeader("Access-Control-Max-Age", "3600");
//        rep.setHeader("Access-Control-Allow-Headers", "token,Origin, X-Requested-With, Content-Type, Accept");
//        response.setCharacterEncoding("UTF-8");
//        response.setContentType("application/json; charset=utf-8");
//        String token = req.getHeader("Auth-Token");//header方式
//
//        ((HttpServletResponse) response).setHeader("Content-Type", "application/json;charset=UTF-8");
//
//        String user, redisToken = null;
//
//        //token为空返回
//        if (null == token || token.isEmpty()) {
//            logger.warn("{}>>> token为空,requestToken：{}，返回结果：{}",
//                    uri,token,ErrorCodeEnum.EMPTY_TOKEN.toString());
//            response.getWriter().print(ErrorCodeEnum.EMPTY_TOKEN);
//            response.getWriter().flush();
//            return;
//        }
//
//        //token格式异常
//        if (token.split("\\.").length < 3) {
//            logger.warn("{}>>> requestToken 格式异常,requestToken：{}，返回结果：{}",
//                    uri,token,ErrorCodeEnum.ILLEGAL_TOKEN.toString());
//            response.getWriter().print(ErrorCodeEnum.ILLEGAL_TOKEN);
//            response.getWriter().flush();
//            return ;
//        }
//
//        //校验token
//        try {
//            user = Jwts.parser()
//                    .setSigningKey("MyJwtSecret1AF600AB94AD4CE9ADD37E3B69E78B901AF4CACCAD5748B3945F626868F52DB7")
//                    .parseClaimsJws(token.replace("Bearer ", ""))
//                    .getBody()
//                    .getSubject();
//        } catch (Exception e) {
//
//            logger.warn("{}>>> redisToken和requestToken不一致，redisToken：{}；requestToken：{}，返回结果：{}",
//                    uri, redisToken,"Exception:  "+ e.getMessage(),ErrorCodeEnum.COVERED_TOKEN.toString());
//
//            response.getWriter().print(ErrorCodeEnum.COVERED_TOKEN);
//            response.getWriter().flush();
//            return;
//        }
//
//        //从redis中获取token，校验token是否为空
//        redisToken = (String) redisTemplate.opsForValue().get(Commond.REDIS_KEY_TABLE_USER_TOKEN + user);
//        //校验redis中是否还有token，没有就提示token==null(安全退出的时候会被删掉)
//        if (null == redisToken || redisToken.isEmpty()) {
//            logger.warn("{}>>> redisToken null,requestToken：{}，返回结果：{}", uri,token,ErrorCodeEnum.UNEXIST_TOKEN.toString());
//            response.getWriter().print(ErrorCodeEnum.UNEXIST_TOKEN);
//            response.getWriter().flush();
//            return;
//        }
//
//        if (!redisToken.equals(token.replace("Bearer ", ""))) {
//            //如果redis中的redisToken和token不一致，说明被覆盖了，也就是说之前的人被踢了
//            logger.warn("{}>>> redisToken和requestToken不一致，redisToken：{}；requestToken：{}，返回结果：{}",uri, redisToken, token.replace("Bearer ", ""),ErrorCodeEnum.COVERED_TOKEN.toString());
//            response.getWriter().print(ErrorCodeEnum.COVERED_TOKEN);
//            response.getWriter().flush();
//            return;
//        }
//
//        //对请求路由
//        chain.doFilter(request, response);
//    }
//
//    @Override
//    public void init(FilterConfig arg0) throws ServletException {
//
//    }
//
//
//}